Ruby 日記 2日目: モジュールをincludeするとそのモジュールのメソッド定義がselfに引き継がれる
#Ruby_日記 #2021-08-27
https://rex.libertyfish.co.jp/exam_histories/42141/user_answers/46ec33a5-41c5-4e56-85b0-7d966a8aa301
次のコードを実行するとどうなりますか
code:gold/ex02/main.rb
module M
def class_m
"class_m"
end
end
class C
include M
end
p C.methods.include? :class_m
選択肢:
trueが表示される
falseが表示される
nilが表示される
警告が表示される
解説:
https://docs.ruby-lang.org/ja/2.1.0/method/Module/i/include.html
インクルードとは、指定されたモジュールの定義 (メソッド、定数) を引き継ぐことです。
つまり、今回の問題だとモジュールMの
code:m.rb
def class_m
"class_m"
end
というメソッド定義がクラスCに引き継がれることになる。
ので、こういうこと。:class_m はインスタンスメソッドになるね。
code:c.rb
class C
def class_m
"class_m"
end
end
https://docs.ruby-lang.org/ja/2.1.0/method/Object/i/methods.html
そのオブジェクトに対して呼び出せるメソッド名の一覧を返します。 このメソッドは public メソッドおよび protected メソッドの名前を返します。
なので、
C.methods はクラスCに対して呼び出せるメソッド(=クラスCのクラスメソッド)の一覧を返す。
なので、最後の p C.methods.include? :class_m は
「クラスCに対して呼び出せるクラスメソッドに :class_m は含まれますか?」という問いなので、答えは false だね
code:sh
# ruby gold/ex02/main.rb
false